//n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上，并且使皇后彼此之间不能相互攻击。 
//
// 给你一个整数 n ，返回 n 皇后问题 不同的解决方案的数量。 
//
// 
//
// 
// 
// 示例 1： 
// 
// 
//输入：n = 4
//输出：2
//解释：如上图所示，4 皇后问题存在两个不同的解法。
// 
// 
// 
//
// 示例 2： 
//
// 
//输入：n = 1
//输出：1
// 
//
// 
//
// 提示： 
//
// 
// 1 <= n <= 9 
// 
//
// Related Topics 回溯 👍 445 👎 0


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int totalNQueens(int n) {
    return  solveNQueens(n);
    }
    public int solveNQueens(int n) {
        List<List<String>> result=new ArrayList<>();
        char[][] board=new char[n][n];
        for (char[] row:board) {
            Arrays.fill(row,'.');
        }
        backTracking(result,board,0);
        return  result.size();
    }

    public void backTracking( List<List<String>> result ,   char[][] board,int row){
        if(board.length==row){
            result.add(createBoard(board));
            return;
        }
        for (int col = 0; col < board.length; col++) {
            if(isValid(board,row,col)){
                board[row][col]='Q';
                backTracking(result,board,row+1);
                board[row][col]='.';
            }
        }
    }
    public boolean isValid(char[][] board,int row,int col){
        int n=board.length;
        for (int i = 0; i <row ; i++) {
            if(board[i][col]=='Q')
                return false;
        }

        for (int i = row-1,j=col-1; i >=0&&j>=0 ; i--,j--) {
            if (board[i][j]=='Q') {
                return  false;
            }
        }

        for (int i = row-1,j=col+1; i >=0&&j<n ; i--,j++) {
            if (board[i][j]=='Q') {
                return  false;
            }
        }

        return  true;
    }

    public List<String> createBoard(char[][] board){
        List<String> soluntion=new ArrayList<>();
        for (char[] row:board) {
            soluntion.add(String.valueOf(row));
        }
        return  soluntion;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
